#include "Ende.h"
#include "qfile.h"


byte aeskey[] = "0123456789ABCDEF0123456789ABCDEF";
byte iv[] = "ABCDEF0123456789";

void Ende::FileEncode(const QString &fileName, const std::string &key) {
    // 通过文件名来获得相关的文件内容。
    if (!QFile::exists(fileName)) {
        // 通知没有该文件
        return;
    }
    QFile file(fileName);
    if (!file.open(QFile::ReadOnly)) {
        //通知没有打开文件
        return;
    }
    qsizetype iMaxSize = 100*1024*1024; // 100 MB

    QByteArray byteArr;
    //读取全部数据，之后更改，需要先判断文件大小来实现不同的读取策略
    if (file.size() > iMaxSize) {
    }else
        byteArr = file.readAll();
    
    std::string mima = EncodeeCBC(std::string(byteArr, byteArr.size()), aeskey, iv);
    std::string plainText = DecodeeCBC(mima, aeskey,  iv);


    // 将读取到的数据进行加密并生成相应的文件。

    //std::u16string fileStr = fileName.toStdU16String();//保证文件可以正常读取，有一些文件可能无法使用string来读取

    // 使用Qt的文件功能来实现文件的读取功能
}

std::u16string Ende::QStr2U16Str(const QString qstr) {
    return qstr.toStdU16String();
}


//AES_CBC 模式
std::string Ende::EncodeeCBC(const std::string& plainText, const byte* key,  const byte* iv)
{
    AESEncryption enEncryption(key, AES::DEFAULT_KEYLENGTH);
    CBC_Mode_ExternalCipher::Encryption cbcEncryption(enEncryption, iv);
    std::string encrypted;
    StringSource(plainText, true, new StreamTransformationFilter(cbcEncryption, new HexEncoder(new StringSink(encrypted))));
    std::cout << "Encrypted: " << encrypted << std::endl;
    return encrypted;
}

std::string  Ende::DecodeeCBC(const std::string& cipherText, const byte* key, const byte* iv)
{
    AESDecryption deEncryption(key, AES::DEFAULT_KEYLENGTH);
    CBC_Mode_ExternalCipher::Decryption cbcDecryption(deEncryption, iv);
    std::string decrypted;

    // 使用std::unique_ptr来管理内存  
    StreamTransformationFilter * temp = new StreamTransformationFilter(cbcDecryption, new HexDecoder(new StringSink(decrypted)));
    std::string str = "yes";
    StringSource(cipherText, true, temp);
    delete temp;
    std::cout << "Encrypted: " << decrypted << std::endl;
    return decrypted;
}
